<!DOCTYPE html>


<html lang="en">


<head>
  <meta charset="utf-8" />
   
  <meta name="keywords" content="学习" />
   
  <meta name="description" content="G.zero的个人博客" />
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
  <title>
     yang-blog
  </title>
  <meta name="generator" content="hexo-theme-ayer">
  
  <link rel="shortcut icon" href="/favicon.ico" />
  
  
<link rel="stylesheet" href="/dist/main.css">

  
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/Shen-Yu/cdn/css/remixicon.min.css">

  
<link rel="stylesheet" href="/css/custom.css">

  
  
<script src="https://cdn.jsdelivr.net/npm/pace-js@1.0.2/pace.min.js"></script>

  
  

  

</head>

</html>

<body>
  <div id="app">
    
      
    <main class="content on">
      
<section class="cover">
    
  <div class="cover-frame">
    <div class="bg-box">
      <img src="/images/cover1.jpg" alt="image frame" />
    </div>
    <div class="cover-inner text-center text-white">
      <h1><a href="/">yang-blog</a></h1>
      <div id="subtitle-box">
        
        <span id="subtitle"></span>
        
      </div>
      <div>
        
      </div>
    </div>
  </div>
  <div class="cover-learn-more">
    <a href="javascript:void(0)" class="anchor"><i class="ri-arrow-down-line"></i></a>
  </div>
</section>



<script src="https://cdn.jsdelivr.net/npm/typed.js@2.0.11/lib/typed.min.js"></script>


<!-- Subtitle -->

  <script>
    try {
      var typed = new Typed("#subtitle", {
        strings: ['为学当如群山式，一峰突起众峰环', '愿你一生努力，一生被爱', '想要的都拥有，得不到的都释怀'],
        startDelay: 0,
        typeSpeed: 200,
        loop: true,
        backSpeed: 100,
        showCursor: false
      });
    } catch (err) {
      console.log(err)
    }
  </script>
  
<div id="main">
  <section class="outer">
  
  

<div class="notice" style="margin-top:50px">
    <i class="ri-heart-fill"></i>
    <div class="notice-content" id="broad"></div>
</div>
<script type="text/javascript">
    fetch('https://v1.hitokoto.cn')
        .then(response => response.json())
        .then(data => {
            document.getElementById("broad").innerHTML = data.hitokoto;
        })
        .catch(console.error)
</script>

<style>
    .notice {
        padding: 20px;
        border: 1px dashed #e6e6e6;
        color: #969696;
        position: relative;
        display: inline-block;
        width: 100%;
        background: #fbfbfb50;
        border-radius: 10px;
    }

    .notice i {
        float: left;
        color: #999;
        font-size: 16px;
        padding-right: 10px;
        vertical-align: middle;
        margin-top: -2px;
    }

    .notice-content {
        display: initial;
        vertical-align: middle;
    }
</style>
  
  <article class="articles">
    
    
    
    
    <article
  id="post-日常/得到-20-11-4"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/22/%E6%97%A5%E5%B8%B8/%E5%BE%97%E5%88%B0-20-11-4/"
    >面试(20-11-4)</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/22/%E6%97%A5%E5%B8%B8/%E5%BE%97%E5%88%B0-20-11-4/" class="article-date">
  <time datetime="2020-11-22T15:18:16.000Z" itemprop="datePublished">2020-11-22</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E5%BE%97%E5%88%B0/">得到</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <h1 id="1-自己已经升为管理岗位，但是还是在做着业务，想知道如何成为一个管理者"><a href="#1-自己已经升为管理岗位，但是还是在做着业务，想知道如何成为一个管理者" class="headerlink" title="1.自己已经升为管理岗位，但是还是在做着业务，想知道如何成为一个管理者"></a>1.自己已经升为管理岗位，但是还是在做着业务，想知道如何成为一个管理者</h1><p>一个管理者，先要知道管理者的定义：带领并发动你的团队，而不是自己把事情干了</p>
<p>管理者需要服众，不要远离业务，保持专业能力，成为下属的榜样，可以带着团队干事。</p>
<p>学会授权，培养能力强的人，让他分担你的工作。同时要规范流程，授权下属去做，定期汇报工作的成果。</p>
<p>同时，自己也要积极向上汇报工作进度，表现自己的责任感。获得更多的信任。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/" rel="tag">读书笔记</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-日常/Vscode使用技巧"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/15/%E6%97%A5%E5%B8%B8/Vscode%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/"
    >Vscode使用技巧</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/15/%E6%97%A5%E5%B8%B8/Vscode%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/" class="article-date">
  <time datetime="2020-11-15T13:55:17.000Z" itemprop="datePublished">2020-11-15</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8/">日常</a> / <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8/%E6%8A%80%E5%B7%A7/">技巧</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <ul>
<li>切换tab</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ctrl+tab</span><br></pre></td></tr></table></figure>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/vscode/" rel="tag">vscode</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E6%8A%80%E5%B7%A7/" rel="tag">技巧</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-日常/markdown使用技巧"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/15/%E6%97%A5%E5%B8%B8/markdown%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/"
    >markdown使用技巧</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/15/%E6%97%A5%E5%B8%B8/markdown%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/" class="article-date">
  <time datetime="2020-11-15T13:50:32.000Z" itemprop="datePublished">2020-11-15</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8/">日常</a> / <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8/%E6%8A%80%E5%B7%A7/">技巧</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <ul>
<li>给文字添加颜色（使用html标签）<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;font color &#x3D; &#39;red&#39;&gt; content &lt;font&gt;</span><br></pre></td></tr></table></figure>
<font color = 'red'> content <font></li>
</ul>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/markdown/" rel="tag">markdown</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E6%8A%80%E5%B7%A7/" rel="tag">技巧</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-日常/得到-20-11"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/15/%E6%97%A5%E5%B8%B8/%E5%BE%97%E5%88%B0-20-11/"
    >自我提升(20-11-3)</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/15/%E6%97%A5%E5%B8%B8/%E5%BE%97%E5%88%B0-20-11/" class="article-date">
  <time datetime="2020-11-15T11:40:25.000Z" itemprop="datePublished">2020-11-15</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E5%BE%97%E5%88%B0/">得到</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>从今天开始，每天从得到上学习，并且记录学习的收货，可摘抄，感想，收获等，不管记录的是多是少，都要每天更新。断更时，记录断更的原因。</p>
<p>记录的维度暂时以周为单位，一周一个主题。写博客的目的还是为了个人提升，所以本周以提升个人能力为主题。</p> 
      <a class="article-more-link" href="/2020/11/15/%E6%97%A5%E5%B8%B8/%E5%BE%97%E5%88%B0-20-11/"
        >阅读更多...</a
      >
       
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/" rel="tag">读书笔记</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-日常/lambda-自定义函数接口"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/12/%E6%97%A5%E5%B8%B8/lambda-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%8E%A5%E5%8F%A3/"
    >lambda-自定义函数接口</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/12/%E6%97%A5%E5%B8%B8/lambda-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%87%BD%E6%95%B0%E6%8E%A5%E5%8F%A3/" class="article-date">
  <time datetime="2020-11-12T09:12:49.000Z" itemprop="datePublished">2020-11-12</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8/">日常</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <h2 id="自定义函数式编程"><a href="#自定义函数式编程" class="headerlink" title="自定义函数式编程"></a>自定义函数式编程</h2><p>编写一个只有一个抽象方法的接口类，使用 @FunctionalInterface 修饰。@FunctionalInterface是可选的，但加上该标注编译器会帮你检查接口是否符合函数接口规范</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@FunctionalInterface</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">AddInterface</span> </span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">add</span><span class="params">(Integer a, Integer b)</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>

<p>那么我们就可以在代码中直接使用了</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AddInterface addInterface = (a,b) -&gt; a-b;</span><br></pre></td></tr></table></figure>



<h2 id="lambda表达式的使用"><a href="#lambda表达式的使用" class="headerlink" title="lambda表达式的使用"></a>lambda表达式的使用</h2><h3 id="1-无参"><a href="#1-无参" class="headerlink" title="1.无参"></a>1.无参</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Thread thread = <span class="keyword">new</span> Thread(() -&gt; System.out.println(<span class="string">&quot;执行线程方法&quot;</span>));</span><br></pre></td></tr></table></figure>

<h3 id="2-有参数"><a href="#2-有参数" class="headerlink" title="2.有参数"></a>2.有参数</h3><p>上面自定义的接口就是有两个参数的接口</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">AddInterface addInterface = (a,b) -&gt; a-b;</span><br></pre></td></tr></table></figure>

 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/lambda/" rel="tag">lambda</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-设计模式/设计模式原则"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/04/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/"
    >设计模式原则</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/04/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%8E%9F%E5%88%99/" class="article-date">
  <time datetime="2020-11-04T15:26:24.000Z" itemprop="datePublished">2020-11-04</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/">设计模式</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
   
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E4%BB%A3%E7%A0%81/" rel="tag">代码</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-日常/jar包冲突"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2020/11/04/%E6%97%A5%E5%B8%B8/jar%E5%8C%85%E5%86%B2%E7%AA%81/"
    >jar包冲突</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2020/11/04/%E6%97%A5%E5%B8%B8/jar%E5%8C%85%E5%86%B2%E7%AA%81/" class="article-date">
  <time datetime="2020-11-04T14:27:02.000Z" itemprop="datePublished">2020-11-04</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/%E6%97%A5%E5%B8%B8%E6%AF%94%E8%BE%83/">日常比较</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>&nbsp;&nbsp;明天需要上线需求，所以准备和代码。下班的时候群里就有同事反馈，pre_master分支起不来，直到我准备和代码的时候已经过去2个小时，群里没有动静，心想问题应该已经处理了。为了保险起见还是跑了一遍代码。我擦，没人处理，2个小时过去了，代码一直有人往上和，就是没人处理起不来的问题。好吧，我先看下什么问题吧。。</p>
<p>从报错看在加载rpc client类时报错，看着像resty-pass的jar包的问题，想起有同事升级这个jar的版本的需求，就翻看了jar的说明文档，里面明确提出，升级到6以上的版本，需要注意netty-common的版本需要与之对应。</p>
<img src="/2020/11/04/%E6%97%A5%E5%B8%B8/jar%E5%8C%85%E5%86%B2%E7%AA%81/%E5%90%AF%E5%8A%A8%E5%A4%B1%E8%B4%A5.jpg" class="" title="[启动失败.jpg]">

<p>通过maven helper工具 发现，确实工程中存在两个版本的netty-common，联系同事，处理问题。搞定，和代码睡觉。</p>
<p>睡觉之前顺便，写一下 <strong>如何处理jar冲突</strong></p>
<h3 id="1-下载idea插件-maven-helper"><a href="#1-下载idea插件-maven-helper" class="headerlink" title="1.下载idea插件 maven helper"></a>1.下载idea插件 maven helper</h3><p>这个就不用太细节了，如下图</p>
<img src="/2020/11/04/%E6%97%A5%E5%B8%B8/jar%E5%8C%85%E5%86%B2%E7%AA%81/maven%E6%8F%92%E4%BB%B6.png" class="" title="[maven插件.png]">


<h3 id="2-插件的使用"><a href="#2-插件的使用" class="headerlink" title="2.插件的使用"></a>2.插件的使用</h3><p>进入pom文件，会发现，走下角多个一个tab,这个就是maven helper的界面</p>
<p>界面有三个选项：</p>
<p>Conflicts（查看冲突）<br>All Dependencies as List（列表形式查看所有依赖）<br>All Dependencies as Tree（树形式查看所有依赖）</p>
<img src="/2020/11/04/%E6%97%A5%E5%B8%B8/jar%E5%8C%85%E5%86%B2%E7%AA%81/%E7%95%8C%E9%9D%A2.png" class="" title="[界面.png]">



<h3 id="3-当出现冲突jar时，右击可以进行处理"><a href="#3-当出现冲突jar时，右击可以进行处理" class="headerlink" title="3.当出现冲突jar时，右击可以进行处理"></a>3.当出现冲突jar时，右击可以进行处理</h3><p>当然，处理jar包，还是需要进行评估下，是否会对系统的功能有影响，不能盲目的一顿操作。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/" rel="tag">开发环境</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-springboot/springboot-yml"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2019/06/12/springboot/springboot-yml/"
    >再学SpringBoot-springboot配置文件的使用</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2019/06/12/springboot/springboot-yml/" class="article-date">
  <time datetime="2019-06-12T13:23:00.000Z" itemprop="datePublished">2019-06-12</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/SpringBoot/">SpringBoot</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>springboot最大的改进就是简化的大量的配置，但是并不是完全的免配置，本文就介绍一下springboot是如何使用配置文件</p>
<h3 id="1-配置文件"><a href="#1-配置文件" class="headerlink" title="1. 配置文件"></a>1. 配置文件</h3><p>springboot的配置文件放在resources文件夹中，支持两种文件格式，一种是常规的properties文件，另外一种就是 yml 文件。本文主要使用yml文件。</p>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SpringBoot/" rel="tag">SpringBoot</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-springboot/springboot-frist"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2019/05/29/springboot/springboot-frist/"
    >再学SpringBoot-搭建第一个springboot项目</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2019/05/29/springboot/springboot-frist/" class="article-date">
  <time datetime="2019-05-29T08:59:41.000Z" itemprop="datePublished">2019-05-29</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/SpringBoot/">SpringBoot</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <p>springboot 已经使用了两年，但是对springboot没有系统的学习过，所以打算系统的学习一下Springboot。以较为学，应该是最有效的学习方法，所以通过边学边写教程的方式，来学习。</p>
<h2 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h2><ul>
<li>jdk:1.8</li>
<li>springboot:2.0.1</li>
<li>开发工具：idea</li>
<li>构建工具：maven</li>
</ul>
<h2 id="项目搭建"><a href="#项目搭建" class="headerlink" title="项目搭建"></a>项目搭建</h2><p>springboot为开发者提供了模板，所以开发者可以通过网站直接创建一个springboot项目。这里我通过idea直接创建第一个springboot项目</p>
<h3 id="1-步骤"><a href="#1-步骤" class="headerlink" title="1 步骤"></a>1 步骤</h3><p>点击File -&gt; new - project，选择Spring Initializr。<br><img src="./springboot1.png" alt="springboot1.png"><br>输入信息<br><img src="./springboot2.png" alt="springboot2.png"><br>在这里我们可以选择需要的jar包，创建时会自动为我们引入，不在需要自己手动去添加。同时可以选择springboot的版本。<br><img src="./springboot3.png" alt="springboot3.png"><br>选择路径，创建完成。<br><img src="./springboot3.png" alt="springboot3.png"></p>
<h3 id="2-目录结构"><a href="#2-目录结构" class="headerlink" title="2.目录结构"></a>2.目录结构</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">- src</span><br><span class="line">    -main</span><br><span class="line">        -java</span><br><span class="line">            -package</span><br><span class="line">                #主函数，启动类，运行它如果运行了 Tomcat、Jetty、Undertow 等容器</span><br><span class="line">                -SpringbootApplication	</span><br><span class="line">        -resouces</span><br><span class="line">            #存放静态资源 js&#x2F;css&#x2F;images 等</span><br><span class="line">            - statics</span><br><span class="line">            #存放 html 模板文件</span><br><span class="line">            - templates</span><br><span class="line">            #主要的配置文件，SpringBoot启动时候会自动加载application.yml&#x2F;application.properties		</span><br><span class="line">            - application.yml</span><br><span class="line">    #测试文件存放目录		</span><br><span class="line">    -test</span><br><span class="line"> # pom.xml 文件是Maven构建的基础，里面包含了我们所依赖JAR和Plugin的信息</span><br><span class="line">- pom</span><br></pre></td></tr></table></figure> 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/SpringBoot/" rel="tag">SpringBoot</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
    <article
  id="post-jvm/java-jvm-monitor"
  class="article article-type-post"
  itemscope
  itemprop="blogPost"
  data-scroll-reveal
>
  <div class="article-inner">
    
    <header class="article-header">
       
<h2 itemprop="name">
  <a class="article-title" href="/2019/05/28/jvm/java-jvm-monitor/"
    >java 性能监控与故障处理工具</a> 
</h2>
 

    </header>
     
    <div class="article-meta">
      <a href="/2019/05/28/jvm/java-jvm-monitor/" class="article-date">
  <time datetime="2019-05-28T09:44:35.000Z" itemprop="datePublished">2019-05-28</time>
</a> 
  <div class="article-category">
    <a class="article-category-link" href="/categories/JAVA-JVM/">JAVA_JVM</a>
  </div>
   
    </div>
      
    <div class="article-entry" itemprop="articleBody">
       
  <h2 id="1-JDK命令工具"><a href="#1-JDK命令工具" class="headerlink" title="1.JDK命令工具"></a>1.JDK命令工具</h2><table>
<thead>
<tr>
<th align="left">名称</th>
<th align="left">主要作用</th>
</tr>
</thead>
<tbody><tr>
<td align="left">jps</td>
<td align="left">JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程</td>
</tr>
<tr>
<td align="left">jstat</td>
<td align="left">JVM Statistics Monitoring Tool,用于收集HotSpot虚拟机各方面的运行数据</td>
</tr>
<tr>
<td align="left">jinfo</td>
<td align="left">Configuration Info For Java ,显示虚拟机配置信息</td>
</tr>
<tr>
<td align="left">jmap</td>
<td align="left">Memory Map For Java,生成虚拟机的内存转储快照</td>
</tr>
<tr>
<td align="left">jhat</td>
<td align="left">JVM Heap Dump Browser,用于分析heapdump文件，它会建立一个Http/HTML服务器，让用户可以在浏览器上查看分析结果</td>
</tr>
<tr>
<td align="left">jstack</td>
<td align="left">Stack Trace For Java 显示虚拟机的线程快照</td>
</tr>
</tbody></table>
<h3 id="1-1-jps-虚拟机进程状态工具"><a href="#1-1-jps-虚拟机进程状态工具" class="headerlink" title="1.1 jps:虚拟机进程状态工具"></a>1.1 jps:虚拟机进程状态工具</h3><p>jps列出正在运行的虚拟机进行，并显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。</p>
<p>jps命令:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jps [option] [hostid]</span><br></pre></td></tr></table></figure>

<p>jps执行样例:<br><img src="./jps.png" alt="jps.png"></p>
<table>
<thead>
<tr>
<th align="left">选项</th>
<th align="left">作用</th>
</tr>
</thead>
<tbody><tr>
<td align="left">-q</td>
<td align="left">只输出LVMID，省略主类的名称</td>
</tr>
<tr>
<td align="left">-m</td>
<td align="left">输出虚拟机进程启动是传递给主类main()函数的参数</td>
</tr>
<tr>
<td align="left">-l</td>
<td align="left">输出主类的全名，如果进程执行的是jar包，输出jar路径</td>
</tr>
<tr>
<td align="left">-v</td>
<td align="left">输出虚拟机进程启动时JVM参数</td>
</tr>
</tbody></table>
<h3 id="1-2-jstat-虚拟机统计信息监视工具"><a href="#1-2-jstat-虚拟机统计信息监视工具" class="headerlink" title="1.2 jstat:虚拟机统计信息监视工具"></a>1.2 jstat:虚拟机统计信息监视工具</h3><p>jstat监视虚拟机各种运行状态信息的命令行工具。可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。</p>
<p>jstat命令格式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jstat [option vmid [interval[s|ms][count]]]</span><br></pre></td></tr></table></figure>
<p>vmid:<br>本地：与本地VMID一致。<br>远程：格式如下<br>[protocol:][//]lvmid[@hostname[:port]/servername]</p>
<p>interval:查询间隔。<br>count：次数。</p>
<p>如果省略两个参数，说明只查询一次。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">每250秒查询一次进行2777垃圾收集状况，一次查询20次</span><br><span class="line">jstat -gc 2777 250 20</span><br></pre></td></tr></table></figure>

<p>option:查询虚拟机信息，分为3类：类装载、垃圾收集、运行编译状况</p>
<table>
<thead>
<tr>
<th>选项</th>
<th>作用</th>
</tr>
</thead>
<tbody><tr>
<td>-class</td>
<td>监视类装载。卸载数量、总空间以及类装载所消耗的时间</td>
</tr>
<tr>
<td>-gc</td>
<td>监视java堆状况，包括Eden区、两个Survivor区、老年代、永久代等容量、已用空间、GC时间合计等信息</td>
</tr>
<tr>
<td>-gccapacity</td>
<td>监视内容与-gc基本相同，但是输出主要关注java堆各个区域使用的最大、最小空间</td>
</tr>
<tr>
<td>-gcutil</td>
<td>监视内容与-gc基本相同，但是输出主要关注已使用的空间占总空间的百分比</td>
</tr>
<tr>
<td>-gccause</td>
<td>与-gcutil功能一样，但是会额外输出导致上一次GC产生的原因</td>
</tr>
<tr>
<td>-gcnew</td>
<td>监视新生代GC状况</td>
</tr>
<tr>
<td>-gcnewcapacity</td>
<td>监视内容与-gcnew基本相同，输出主要关注使用到的最大、最小空间</td>
</tr>
<tr>
<td>-gcold</td>
<td>监视老年代GC状况</td>
</tr>
<tr>
<td>-gcoldcapacity</td>
<td>监视内容与-gcold相同，输出主要关注使用到的最大、最小空间</td>
</tr>
<tr>
<td>-gcpermcapacity</td>
<td>输出永久代使用到的最大、最小空间</td>
</tr>
<tr>
<td>-compiler</td>
<td>输出JIT编译器编译过的方法和耗时等信息</td>
</tr>
<tr>
<td>-printcompilation</td>
<td>输出已近被JIT编译方法</td>
</tr>
</tbody></table>
<h3 id="1-3-jinfo-java配置信息工具"><a href="#1-3-jinfo-java配置信息工具" class="headerlink" title="1.3 jinfo:java配置信息工具"></a>1.3 jinfo:java配置信息工具</h3><p>jinfo的作用是实时的查看和调整虚拟机各项参数</p>
<p>jinfo命令</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jinfo [option] pid</span><br></pre></td></tr></table></figure>

<h3 id="1-4-jmap-java内存印象工具"><a href="#1-4-jmap-java内存印象工具" class="headerlink" title="1.4 jmap:java内存印象工具"></a>1.4 jmap:java内存印象工具</h3><p>jmap用于生成堆转储快照（heapdump/dump文件）。还可以查询finalize执行队列、java堆和永久代的详细信息，如空间使用率、当前用的哪种收集器等。</p>
<p>jmap命令</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jmap [option] vmid</span><br></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th>选项</th>
<th>作用</th>
</tr>
</thead>
<tbody><tr>
<td>-dump</td>
<td>生成java堆转储快照，格式为-dump:[live,]format=b,file=&lt;filename&gt;,其中live子参数说明是否只dump出存活的对象</td>
</tr>
<tr>
<td>-finalizerinfo</td>
<td>显示在F-Queue中等待Finalizer线程执行finalize方法的对象。只在Linux/Solaris平台下有效</td>
</tr>
<tr>
<td>-heap</td>
<td>显示java堆详细信息，如使用哪种回收器、参数配置、分代状况等。只在Linux/Solaris平台下有效</td>
</tr>
<tr>
<td>-histo</td>
<td>显示堆中对象统计信息，包括类、实例数量、合计容量</td>
</tr>
<tr>
<td>-permstat</td>
<td>以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效</td>
</tr>
<tr>
<td>-F</td>
<td>当虚拟机进程堆-dump选项没有响应时，可以使用这个选项强制生成dump快照。只在Linux/Solaris</td>
</tr>
<tr>
<td>平台下有效</td>
<td></td>
</tr>
</tbody></table>
<h3 id="1-5-jhat-虚拟机堆转储快照分析工具"><a href="#1-5-jhat-虚拟机堆转储快照分析工具" class="headerlink" title="1.5 jhat:虚拟机堆转储快照分析工具"></a>1.5 jhat:虚拟机堆转储快照分析工具</h3><p>jhat用于生成虚拟机当前时刻快照。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合，生成线程快照的主要目的是定位线程出现长时间停顿的原因，如线程间死锁、死循环、请求外部资源导致的长时间等。</p>
<p>jstack命令</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jstack [option] vmid</span><br></pre></td></tr></table></figure>

<table>
<thead>
<tr>
<th>选项</th>
<th>作用</th>
</tr>
</thead>
<tbody><tr>
<td>-F</td>
<td>当正常输出的请求不被响应时，强制输出线程堆栈</td>
</tr>
<tr>
<td>-l</td>
<td>除堆栈外，显示关于锁的附加信息</td>
</tr>
<tr>
<td>-m</td>
<td>如果调用本地方法的话，可以显示c/c++的堆栈</td>
</tr>
</tbody></table>
 
      <!-- reward -->
      
    </div>
    

    <!-- copyright -->
    
    <footer class="article-footer">
       
  <ul class="article-tag-list" itemprop="keywords"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/JVM/" rel="tag">JVM</a></li></ul>

    </footer>
  </div>

    
 
   
</article>

    
  </article>
  

  
  <nav class="page-nav">
    
    <span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="extend next" rel="next" href="/page/2/">下一页</a>
  </nav>
  
</section>
</div>

      <footer class="footer">
  <div class="outer">
    <ul>
      <li>
        Copyrights &copy;
        2020
        <i class="ri-heart-fill heart_icon"></i> G.zero
      </li>
    </ul>
    <ul>
      <li>
        
        
        
        Powered by <a href="https://hexo.io" target="_blank">Hexo</a>
        <span class="division">|</span>
        Theme - <a href="https://github.com/Shen-Yu/hexo-theme-ayer" target="_blank">Ayer</a>
        
      </li>
    </ul>
    <ul>
      <li>
        
        
        <span>
  <span><i class="ri-user-3-fill"></i>Visitors:<span id="busuanzi_value_site_uv"></span></s>
  <span class="division">|</span>
  <span><i class="ri-eye-fill"></i>Views:<span id="busuanzi_value_page_pv"></span></span>
</span>
        
      </li>
    </ul>
    <ul>
      
    </ul>
    <ul>
      
    </ul>
    <ul>
      <li>
        <!-- cnzz统计 -->
        
      </li>
    </ul>
  </div>
</footer>
      <div class="float_btns">
        <div class="totop" id="totop">
  <i class="ri-arrow-up-line"></i>
</div>

<div class="todark" id="todark">
  <i class="ri-moon-line"></i>
</div>

      </div>
    </main>
    <aside class="sidebar on">
      <button class="navbar-toggle"></button>
<nav class="navbar">
  
  <div class="logo">
    <a href="/"><img src="/images/ayer-side.svg" alt="yang-blog"></a>
  </div>
  
  <ul class="nav nav-main">
    
    <li class="nav-item">
      <a class="nav-item-link" href="/">主页</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/archives">归档</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/categories">分类</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/tags">标签</a>
    </li>
    
    <li class="nav-item">
      <a class="nav-item-link" href="/player">播放器</a>
    </li>
    
  </ul>
</nav>
<nav class="navbar navbar-bottom">
  <ul class="nav">
    <li class="nav-item">
      
      
    </li>
  </ul>
</nav>
<div class="search-form-wrap">
  <div class="local-search local-search-plugin">
  <input type="search" id="local-search-input" class="local-search-input" placeholder="Search...">
  <div id="local-search-result" class="local-search-result"></div>
</div>
</div>
    </aside>
    <script>
      if (window.matchMedia("(max-width: 768px)").matches) {
        document.querySelector('.content').classList.remove('on');
        document.querySelector('.sidebar').classList.remove('on');
      }
    </script>
    <div id="mask"></div>

<!-- #reward -->
<div id="reward">
  <span class="close"><i class="ri-close-line"></i></span>
  <p class="reward-p"><i class="ri-cup-line"></i>请我喝杯咖啡吧~</p>
  <div class="reward-box">
    
    
  </div>
</div>
    
<script src="/js/jquery-2.0.3.min.js"></script>


<script src="/js/lazyload.min.js"></script>

<!-- Tocbot -->

<script src="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery-modal@0.9.2/jquery.modal.min.css">
<script src="https://cdn.jsdelivr.net/npm/justifiedGallery@3.7.0/dist/js/jquery.justifiedGallery.min.js"></script>

<script src="/dist/main.js"></script>

<!-- ImageViewer -->

<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">

    <!-- Background of PhotoSwipe. 
         It's a separate element as animating opacity is faster than rgba(). -->
    <div class="pswp__bg"></div>

    <!-- Slides wrapper with overflow:hidden. -->
    <div class="pswp__scroll-wrap">

        <!-- Container that holds slides. 
            PhotoSwipe keeps only 3 of them in the DOM to save memory.
            Don't modify these 3 pswp__item elements, data is added later on. -->
        <div class="pswp__container">
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
            <div class="pswp__item"></div>
        </div>

        <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
        <div class="pswp__ui pswp__ui--hidden">

            <div class="pswp__top-bar">

                <!--  Controls are self-explanatory. Order can be changed. -->

                <div class="pswp__counter"></div>

                <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>

                <button class="pswp__button pswp__button--share" style="display:none" title="Share"></button>

                <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>

                <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>

                <!-- Preloader demo http://codepen.io/dimsemenov/pen/yyBWoR -->
                <!-- element will get class pswp__preloader--active when preloader is running -->
                <div class="pswp__preloader">
                    <div class="pswp__preloader__icn">
                        <div class="pswp__preloader__cut">
                            <div class="pswp__preloader__donut"></div>
                        </div>
                    </div>
                </div>
            </div>

            <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class="pswp__share-tooltip"></div>
            </div>

            <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
            </button>

            <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
            </button>

            <div class="pswp__caption">
                <div class="pswp__caption__center"></div>
            </div>

        </div>

    </div>

</div>

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/default-skin/default-skin.min.css">
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/photoswipe@4.1.3/dist/photoswipe-ui-default.min.js"></script>

<script>
    function viewer_init() {
        let pswpElement = document.querySelectorAll('.pswp')[0];
        let $imgArr = document.querySelectorAll(('.article-entry img:not(.reward-img)'))

        $imgArr.forEach(($em, i) => {
            $em.onclick = () => {
                // slider展开状态
                // todo: 这样不好，后面改成状态
                if (document.querySelector('.left-col.show')) return
                let items = []
                $imgArr.forEach(($em2, i2) => {
                    let img = $em2.getAttribute('data-idx', i2)
                    let src = $em2.getAttribute('data-target') || $em2.getAttribute('src')
                    let title = $em2.getAttribute('alt')
                    // 获得原图尺寸
                    const image = new Image()
                    image.src = src
                    items.push({
                        src: src,
                        w: image.width || $em2.width,
                        h: image.height || $em2.height,
                        title: title
                    })
                })
                var gallery = new PhotoSwipe(pswpElement, PhotoSwipeUI_Default, items, {
                    index: parseInt(i)
                });
                gallery.init()
            }
        })
    }
    viewer_init()
</script>

<!-- MathJax -->

<!-- Katex -->

<!-- busuanzi  -->


<script src="/js/busuanzi-2.3.pure.min.js"></script>


<!-- ClickLove -->

<!-- ClickBoom1 -->

<!-- ClickBoom2 -->

<!-- CodeCopy -->


<link rel="stylesheet" href="/css/clipboard.css">

<script src="https://cdn.jsdelivr.net/npm/clipboard@2/dist/clipboard.min.js"></script>
<script>
  function wait(callback, seconds) {
    var timelag = null;
    timelag = window.setTimeout(callback, seconds);
  }
  !function (e, t, a) {
    var initCopyCode = function(){
      var copyHtml = '';
      copyHtml += '<button class="btn-copy" data-clipboard-snippet="">';
      copyHtml += '<i class="ri-file-copy-2-line"></i><span>COPY</span>';
      copyHtml += '</button>';
      $(".highlight .code pre").before(copyHtml);
      $(".article pre code").before(copyHtml);
      var clipboard = new ClipboardJS('.btn-copy', {
        target: function(trigger) {
          return trigger.nextElementSibling;
        }
      });
      clipboard.on('success', function(e) {
        let $btn = $(e.trigger);
        $btn.addClass('copied');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-checkbox-circle-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPIED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-checkbox-circle-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
      clipboard.on('error', function(e) {
        e.clearSelection();
        let $btn = $(e.trigger);
        $btn.addClass('copy-failed');
        let $icon = $($btn.find('i'));
        $icon.removeClass('ri-file-copy-2-line');
        $icon.addClass('ri-time-line');
        let $span = $($btn.find('span'));
        $span[0].innerText = 'COPY FAILED';
        
        wait(function () { // 等待两秒钟后恢复
          $icon.removeClass('ri-time-line');
          $icon.addClass('ri-file-copy-2-line');
          $span[0].innerText = 'COPY';
        }, 2000);
      });
    }
    initCopyCode();
  }(window, document);
</script>


<!-- CanvasBackground -->


    
  </div>
</body>

</html>